// function foo(x,y='world'){
//     console.log(x,y);
// }
// foo('hello',0)//hello 0

//参数默认值必须放在最后一位
// function foo(x,y,z="sss"){
//     console.log(x,y,z);
// }
// foo('hello',0)//hello 0 sss


// // 与解构赋值的结合
// function foo({x,y="true"}){
//     console.log(x,y);
// }
// foo({})//undefined 'true'

// 与解构赋值的结合
// function foo({x,y="true"}){
//     console.log(x,y);
// }
// foo({
//     x:"zsb",
//     y:1
// })// zsb 1 参数传递要一一对应


// 给一个默认值={},这样就算不传{method:'POST'}也不会报错
// function ajax(url,{
//     body='',
//     method='GET',
//     headers={}
// }={}){
//     console.log(method);
// }
// ajax('http://www.imooc.com',{
//     method:'POST'
// })


// length的作用，获取没有指定参数默认是的个数
// function foo(x,y){

// }
// console.log(foo.length);//2
// function foo(x,y=1){


// }
// console.log(foo.length);//1
// function foo(x=1,y=2){

// }
// console.log(foo.length);//0


//  作用域
// let x =1;
// function foo(x,y=x){
//     console.log(y);//2
//     // foo()调用的时候，函数内部形成一个函数作用域，变量只会在作用域内部匹配
//     // 解析 x=2，y=x=2
// }
// foo(2)

// let x=1;
// function foo(y=x){
//     let x=2
//     console.log(y);//1
//     // 函数内部定义的x的值不会影响参数的默认值，所以沿着作用域链找到全局的x=1
// }
// foo()


// function foo(y=x){
//    let x=2
//     console.log(y);//报错 函数未定义
//     // 函数内部定义的x的值不会影响参数的默认值，所以沿着作用域链找到全局的x，由于没有找到所以报错x未定义
// }
// foo()




// 函数的neme属性

// function foo(){}
// console.log(foo.name);//foo

// console.log((new Function).name);//anonymous匿名函数

// function foo(x,y){
//     console.log(this);//{name: 'zz'}
// }
// foo.bind({name:'zz'})()
// console.log(foo.bind({}).name);//bound foo
// console.log((function(){}).bind({name:'zz'}).name);//bound  匿名函数通过bind改变this指向后 输出。name是bound
